/*
 * @(#)XfvhdlFuzzyMeanDefuzzificationMethod.java     3.0      2004/09/14
 *
 * This file is part of Xfuzzy 3.0, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfvhdl;

/**
* Clase que implementa el m�todo de defuzzuficaci�n FuzzyMean.
* @author Jos� Mar�a �vila Maireles, <b>e-mail</b>: josavimai@alum.us.es
* @version 3.0
*/
public class XfvhdlFuzzyMeanDefuzzificationMethod
   implements XfvhdlIDefuzzification {

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //				CONSTRUCTOR DE LA CLASE					 	   
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//	
   /** M�todo construtor de la clase.
   */
   public XfvhdlFuzzyMeanDefuzzificationMethod() {
   }

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //			M�TO_DOS P�BLICOS DE LA CLASE				        
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   /**
   * M�todo que calcula las constantes que se incluiran en el fichero 
   * Constants.vhdl y que dependen de este metodo de defuzzificacion.
   * @return Devuelve un vector de enteros. En vector[0] se almacena 
   * la constante w_reglas, en vector[1] se almacena la constante i_1 
   * y en vector[2] se almacena i_2.
   */
   public int[] calculateConstants(int N, int grad, int K) {
      int vector[] = new int[3];

      vector[0] = N;
      vector[1] = Math.max(N, grad);
      vector[2] = Math.max(grad, 2 * grad);

      return vector;
   }

   /**
   * M�todo que genera las entidades para el fichero Entities.vhdl y
   * que dependen de este metodo de defuzzificacion.
   * @return Devuelve un String que contiene la entidad que define 
   * este defuzzificador.
   */
   public String generateEntities() {
      String cad = new String();

      cad =
         "component FuzzyMean\n"
            + "\tport(\tpunto\t\t\t: in std_logic_vector(N downto 1);\n"
            + "\t\tgrado\t\t\t: in std_logic_vector(grad downto 1);\n"
            + "\t\tacumulacion\t\t: in std_logic;\n"
            + "\t\tclear_almacen\t: in std_logic;\n"
            + "\t\tclk\t\t\t: in std_logic;\n"
            + "\n"
            + "\t\tdividendo\t\t: out std_logic_vector(D downto 1);\n"
            + "\t\tdivisor\t\t: out std_logic_vector(DR downto 1));\n"
            + "end component;\n";

      return cad;
   }

   /**
   * M�todo que genera los ficheros que hay que incluir de la libreria
   * en el .prj y que dependen de este metodo de defuzzificacion.
   * @return Devuelve un String que contiene los ficheros que necesita 
   * el .prj
   */
   public String generatePrjFile() {
      String cad = new String();

      cad = "FuzzyMean.vhd";

      return cad;
   }

   /**
   * M�todo que genera parte del c�digo del fichero de salida (FLC.vhdl 
   * por defecto) y que depende de este metodo de defuzzificacion.
   * @return Devuelve un String que contiene codigo que depende de este
   * defuzzificador.
   */
   public String generateOutputFlcUse() {
      String cad = new String();

      cad = "\tfor all: FuzzyMean\t\tuse entity WORK.FuzzyMean(FPGA);\n";

      return cad;
   }

   /**
   * M�todo que genera parte del c�digo del fichero de salida (FLC.vhdl 
   * por defecto) y que depende de este metodo de defuzzificacion.
   * @return Devuelve un String que contiene codigo que depende de este
   * defuzzificador.
   */
   public String generateOutputFlcComponent() {
      String cad = new String();

      cad += "\n"
         + "\tDefuzz: FuzzyMean\n"
         + "\t\tport map(\tpunto\t\t\t=>"
         + " salida_mem_reg(w_reglas downto 1),\n"
         + "\t\t\t\tgrado\t\t\t=> salida_min,\n"
         + "\t\t\t\tacumulacion\t\t=> acumulacion,\n"
         + "\t\t\t\tclear_almacen\t=> clear_almacen,\n"
         + "\t\t\t\tclk\t\t\t=> clk,\n"
         + "\t\t\t\tdividendo\t\t=> dividendo,\n"
         + "\t\t\t\tdivisor\t\t=> divisor);\n";

      return cad;
   }

}
